#ifndef LISTA_CLU_H
#define LISTA_CLU_H

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#include "NoClu.h"

class ListaClu {
public:
    int count;
    NoClu *inicio;
    NoClu *final;

    ListaClu() {
        this->inicio = NULL;
        this->final = NULL;
        this->count = 0;
    }

    int tamanho() {
        return this->count;
    }

    int insereOrdenado(ListaAtri *l, int tamanho, int demanda) {
        this->count++;

        NoClu *aux = new NoClu(l, tamanho, demanda);
        if (final == NULL) { /* primeiro elemento da lista */
            this->final = aux;
            this->inicio = aux;
            return 1;
        }
        NoClu *antigo, *ponteiro;
        ponteiro = this->inicio; /* come�a no topo da lista */
        antigo = NULL;
        while (ponteiro) {
            if (ponteiro->demanda > aux->demanda) {
                antigo = ponteiro;
                ponteiro = ponteiro->proximo;
            } else {
                if (ponteiro->anterior) {
                    ponteiro->anterior->proximo = aux;
                    aux->proximo = ponteiro;
                    aux->anterior = ponteiro->anterior;
                    ponteiro->anterior = aux;
                    return 1;
                }
                aux->proximo = ponteiro; /* novo primeiro elemento */
                aux->anterior = NULL;
                ponteiro->anterior = aux;
                this->inicio = aux;
                return 1;
            }
        }
        antigo->proximo = aux; /* coloca no final */
        aux->anterior = antigo;
        this->final = aux;
        return 1;
    }

    bool hasElement(int i) {
        NoClu *aux = this->inicio;
        while (aux) {
            NoLista *a = aux->lista->inicio;
            while (a) {
                if (a->elemento == i)
                    return true;
                a = a->proximo;
            }
            aux = aux->proximo;
        }
        return false;
    }

    void clear() {
        while (this->inicio) {
            NoClu *aux = this->inicio;
            this->inicio = this->inicio->proximo;
            delete(aux);
        }

        this->final = NULL;
        this->count = 0;
    }

    ~ListaClu() {
        clear();
    }
};

#endif
